package com.smart.community.user.controller;

import com.smart.community.user.service.UserPropertyCompanyService;
import com.smart.community.user.dto.UserPropertyCompanyDTO;
import com.smart.community.user.dto.UserPropertyCompanyQueryDTO;
import com.smart.community.user.vo.UserPropertyCompanyVO;
import com.smart.community.commons.result.PageResult;
import com.smart.community.commons.result.Result;
import com.smart.community.commons.annotation.ApiLog;
import com.smart.community.commons.enums.ApiLogOperationType;
import com.smart.community.commons.utils.SecurityUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import lombok.extern.slf4j.Slf4j;

import javax.validation.Valid;
import java.util.List;

/**
 * 用户物业公司管理控制器
 *
 * @author Wu.Liang
 * @since 2025-07-05
 */
@RestController
@RequestMapping("/user/property-companies")
@Tag(name = "用户物业公司管理", description = "用户物业公司管理相关接口")
@Slf4j
public class UserPropertyCompanyController {

    @Autowired
    private UserPropertyCompanyService userPropertyCompanyService;

    @GetMapping
    @Operation(summary = "分页查询用户物业公司列表", description = "根据条件分页查询用户物业公司列表")
    public Result<PageResult<UserPropertyCompanyVO>> getUserPropertyCompanyList(
            @Parameter(description = "查询条件") UserPropertyCompanyQueryDTO queryDTO) throws Exception {
        try {
            log.info("开始分页查询用户物业公司列表，操作人：{}，查询条件：{}", SecurityUtils.getCurrentUserId(), queryDTO);
            
            // 权限控制
            Long currentUserId = SecurityUtils.getCurrentUserId();
            if (currentUserId == null) {
                return Result.fail("用户未登录");
            }
            
            PageResult<UserPropertyCompanyVO> result = userPropertyCompanyService.getUserPropertyCompanyList(queryDTO);
            
            log.info("分页查询用户物业公司列表成功，操作人：{}，返回记录数：{}", currentUserId, result.getRecords().size());
            return Result.success("查询成功", result);
        } catch (Exception e) {
            log.error("分页查询用户物业公司列表失败，操作人：{}，查询条件：{}，错误信息：{}", SecurityUtils.getCurrentUserId(), queryDTO, e.getMessage(), e);
            return Result.fail("查询失败：" + e.getMessage());
        }
    }

    @GetMapping("/{id}")
    @Operation(summary = "根据ID查询用户物业公司", description = "根据ID查询用户物业公司详细信息")
    public Result<UserPropertyCompanyVO> getUserPropertyCompany(
            @Parameter(description = "用户物业公司ID") @PathVariable Long id) throws Exception {
        try {
            log.info("开始根据ID查询用户物业公司，操作人：{}，ID：{}", SecurityUtils.getCurrentUserId(), id);
            
            // 权限控制
            Long currentUserId = SecurityUtils.getCurrentUserId();
            if (currentUserId == null) {
                return Result.fail("用户未登录");
            }
            
            // 参数校验
            if (id == null || id <= 0) {
                return Result.fail("用户物业公司ID不能为空或无效");
            }
            
            UserPropertyCompanyVO result = userPropertyCompanyService.getUserPropertyCompany(id);
            
            log.info("根据ID查询用户物业公司成功，操作人：{}，ID：{}", currentUserId, id);
            return Result.success("查询成功", result);
        } catch (Exception e) {
            log.error("根据ID查询用户物业公司失败，操作人：{}，ID：{}，错误信息：{}", SecurityUtils.getCurrentUserId(), id, e.getMessage(), e);
            return Result.fail("查询失败：" + e.getMessage());
        }
    }

    @ApiLog(
        logTitle = "新增用户物业公司",
        logType = 2,
        moduleName = "用户管理",
        operationType = ApiLogOperationType.ADD
    )
    @PostMapping
    @Operation(summary = "新增用户物业公司", description = "创建新的用户物业公司关联关系")
    public Result<String> createUserPropertyCompany(
            @Parameter(description = "用户物业公司信息") @RequestBody @Valid UserPropertyCompanyDTO userPropertyCompanyDTO) throws Exception {
        try {
            log.info("开始新增用户物业公司，操作人：{}，用户物业公司信息：{}", SecurityUtils.getCurrentUserId(), userPropertyCompanyDTO);
            
            // 权限控制
            Long currentUserId = SecurityUtils.getCurrentUserId();
            if (currentUserId == null) {
                return Result.fail("用户未登录");
            }
            
            // 权限控制：只有管理员可以创建用户物业公司关联
            if (!SecurityUtils.hasRole("admin")) {
                return Result.fail("无权限创建用户物业公司关联");
            }
            
            userPropertyCompanyService.createUserPropertyCompany(userPropertyCompanyDTO);
            
            log.info("新增用户物业公司成功，操作人：{}，用户物业公司信息：{}", currentUserId, userPropertyCompanyDTO);
            return Result.success("新增用户物业公司成功");
        } catch (Exception e) {
            log.error("新增用户物业公司失败，操作人：{}，用户物业公司信息：{}，错误信息：{}", SecurityUtils.getCurrentUserId(), userPropertyCompanyDTO, e.getMessage(), e);
            return Result.fail("新增用户物业公司失败：" + e.getMessage());
        }
    }

    @ApiLog(
        logTitle = "更新用户物业公司",
        logType = 2,
        moduleName = "用户管理",
        operationType = ApiLogOperationType.UPDATE
    )
    @PutMapping("/{id}")
    @Operation(summary = "更新用户物业公司", description = "更新用户物业公司关联关系信息")
    public Result<String> updateUserPropertyCompany(
            @Parameter(description = "用户物业公司ID") @PathVariable Long id, 
            @Parameter(description = "用户物业公司信息") @RequestBody @Valid UserPropertyCompanyDTO userPropertyCompanyDTO) throws Exception {
        try {
            log.info("开始更新用户物业公司，操作人：{}，ID：{}，用户物业公司信息：{}", SecurityUtils.getCurrentUserId(), id, userPropertyCompanyDTO);
            
            // 权限控制
            Long currentUserId = SecurityUtils.getCurrentUserId();
            if (currentUserId == null) {
                return Result.fail("用户未登录");
            }
            
            // 权限控制：只有管理员可以更新用户物业公司关联
            if (!SecurityUtils.hasRole("admin")) {
                return Result.fail("无权限更新用户物业公司关联");
            }
            
            // 参数校验
            if (id == null || id <= 0) {
                return Result.fail("用户物业公司ID不能为空或无效");
            }
            
            userPropertyCompanyService.updateUserPropertyCompany(id, userPropertyCompanyDTO);
            
            log.info("更新用户物业公司成功，操作人：{}，ID：{}", currentUserId, id);
            return Result.success("更新用户物业公司成功");
        } catch (Exception e) {
            log.error("更新用户物业公司失败，操作人：{}，ID：{}，错误信息：{}", SecurityUtils.getCurrentUserId(), id, e.getMessage(), e);
            return Result.fail("更新用户物业公司失败：" + e.getMessage());
        }
    }

    @ApiLog(
        logTitle = "删除用户物业公司",
        logType = 2,
        moduleName = "用户管理",
        operationType = ApiLogOperationType.DELETE
    )
    @DeleteMapping("/{id}")
    @Operation(summary = "删除用户物业公司", description = "删除用户物业公司关联关系")
    public Result<String> deleteUserPropertyCompany(
            @Parameter(description = "用户物业公司ID") @PathVariable Long id) throws Exception {
        try {
            log.info("开始删除用户物业公司，操作人：{}，ID：{}", SecurityUtils.getCurrentUserId(), id);
            
            // 权限控制
            Long currentUserId = SecurityUtils.getCurrentUserId();
            if (currentUserId == null) {
                return Result.fail("用户未登录");
            }
            
            // 权限控制：只有管理员可以删除用户物业公司关联
            if (!SecurityUtils.hasRole("admin")) {
                return Result.fail("无权限删除用户物业公司关联");
            }
            
            // 参数校验
            if (id == null || id <= 0) {
                return Result.fail("用户物业公司ID不能为空或无效");
            }
            
            userPropertyCompanyService.deleteUserPropertyCompany(id);
            
            log.info("删除用户物业公司成功，操作人：{}，ID：{}", currentUserId, id);
            return Result.success("删除用户物业公司成功");
        } catch (Exception e) {
            log.error("删除用户物业公司失败，操作人：{}，ID：{}，错误信息：{}", SecurityUtils.getCurrentUserId(), id, e.getMessage(), e);
            return Result.fail("删除用户物业公司失败：" + e.getMessage());
        }
    }

    @ApiLog(
        logTitle = "更新用户物业公司状态",
        logType = 2,
        moduleName = "用户管理",
        operationType = ApiLogOperationType.UPDATE
    )
    @PutMapping("/{id}/status")
    @Operation(summary = "更新用户物业公司状态", description = "更新用户物业公司关联关系的状态")
    public Result<String> updateUserPropertyCompanyStatus(
            @Parameter(description = "用户物业公司ID") @PathVariable Long id, 
            @Parameter(description = "状态：0-禁用，1-启用") @RequestParam Integer status) throws Exception {
        try {
            log.info("开始更新用户物业公司状态，操作人：{}，ID：{}，状态：{}", SecurityUtils.getCurrentUserId(), id, status);
            
            // 权限控制
            Long currentUserId = SecurityUtils.getCurrentUserId();
            if (currentUserId == null) {
                return Result.fail("用户未登录");
            }
            
            // 权限控制：只有管理员可以更新用户物业公司状态
            if (!SecurityUtils.hasRole("admin")) {
                return Result.fail("无权限更新用户物业公司状态");
            }
            
            // 参数校验
            if (id == null || id <= 0) {
                return Result.fail("用户物业公司ID不能为空或无效");
            }
            if (status == null || (status != 0 && status != 1)) {
                return Result.fail("状态值无效，只能为0（禁用）或1（启用）");
            }
            
            userPropertyCompanyService.updateUserPropertyCompanyStatus(id, status);
            
            log.info("更新用户物业公司状态成功，操作人：{}，ID：{}，状态：{}", currentUserId, id, status);
            return Result.success("更新用户物业公司状态成功");
        } catch (Exception e) {
            log.error("更新用户物业公司状态失败，操作人：{}，ID：{}，状态：{}，错误信息：{}", SecurityUtils.getCurrentUserId(), id, status, e.getMessage(), e);
            return Result.fail("更新用户物业公司状态失败：" + e.getMessage());
        }
    }

    @GetMapping("/user/{userId}")
    @Operation(summary = "获取用户关联的物业公司", description = "获取指定用户关联的所有物业公司")
    public Result<List<UserPropertyCompanyVO>> getUserPropertyCompanies(
            @Parameter(description = "用户ID") @PathVariable Long userId) throws Exception {
        try {
            log.info("开始获取用户关联的物业公司，操作人：{}，用户ID：{}", SecurityUtils.getCurrentUserId(), userId);
            
            // 权限控制
            Long currentUserId = SecurityUtils.getCurrentUserId();
            if (currentUserId == null) {
                return Result.fail("用户未登录");
            }
            
            // 参数校验
            if (userId == null || userId <= 0) {
                return Result.fail("用户ID不能为空或无效");
            }
            
            List<UserPropertyCompanyVO> result = userPropertyCompanyService.getUserPropertyCompanies(userId);
            
            log.info("获取用户关联的物业公司成功，操作人：{}，用户ID：{}，返回数量：{}", currentUserId, userId, result.size());
            return Result.success("查询成功", result);
        } catch (Exception e) {
            log.error("获取用户关联的物业公司失败，操作人：{}，用户ID：{}，错误信息：{}", SecurityUtils.getCurrentUserId(), userId, e.getMessage(), e);
            return Result.fail("查询失败：" + e.getMessage());
        }
    }

    @ApiLog(
        logTitle = "分配用户物业公司",
        logType = 2,
        moduleName = "用户管理",
        operationType = ApiLogOperationType.UPDATE
    )
    @PostMapping("/user/{userId}")
    @Operation(summary = "分配用户物业公司", description = "为用户分配物业公司关联关系")
    public Result<String> assignUserPropertyCompanies(
            @Parameter(description = "用户ID") @PathVariable Long userId, 
            @Parameter(description = "物业公司ID列表") @RequestBody List<Long> propertyCompanyIds) throws Exception {
        try {
            log.info("开始分配用户物业公司，操作人：{}，用户ID：{}，物业公司ID列表：{}", SecurityUtils.getCurrentUserId(), userId, propertyCompanyIds);
            
            // 权限控制
            Long currentUserId = SecurityUtils.getCurrentUserId();
            if (currentUserId == null) {
                return Result.fail("用户未登录");
            }
            
            // 权限控制：只有管理员可以分配用户物业公司
            if (!SecurityUtils.hasRole("admin")) {
                return Result.fail("无权限分配用户物业公司");
            }
            
            // 参数校验
            if (userId == null || userId <= 0) {
                return Result.fail("用户ID不能为空或无效");
            }
            if (propertyCompanyIds == null || propertyCompanyIds.isEmpty()) {
                return Result.fail("物业公司ID列表不能为空");
            }
            
            userPropertyCompanyService.assignUserPropertyCompanies(userId, propertyCompanyIds);
            
            log.info("分配用户物业公司成功，操作人：{}，用户ID：{}，物业公司数量：{}", currentUserId, userId, propertyCompanyIds.size());
            return Result.success("分配用户物业公司成功");
        } catch (Exception e) {
            log.error("分配用户物业公司失败，操作人：{}，用户ID：{}，错误信息：{}", SecurityUtils.getCurrentUserId(), userId, e.getMessage(), e);
            return Result.fail("分配用户物业公司失败：" + e.getMessage());
        }
    }

    @GetMapping("/property-company/{propertyCompanyId}")
    @Operation(summary = "获取物业公司关联的用户", description = "获取指定物业公司关联的所有用户")
    public Result<List<UserPropertyCompanyVO>> getPropertyCompanyUsers(
            @Parameter(description = "物业公司ID") @PathVariable Long propertyCompanyId) throws Exception {
        try {
            log.info("开始获取物业公司关联的用户，操作人：{}，物业公司ID：{}", SecurityUtils.getCurrentUserId(), propertyCompanyId);
            
            // 权限控制
            Long currentUserId = SecurityUtils.getCurrentUserId();
            if (currentUserId == null) {
                return Result.fail("用户未登录");
            }
            
            // 参数校验
            if (propertyCompanyId == null || propertyCompanyId <= 0) {
                return Result.fail("物业公司ID不能为空或无效");
            }
            
            List<UserPropertyCompanyVO> result = userPropertyCompanyService.getPropertyCompanyUsers(propertyCompanyId);
            
            log.info("获取物业公司关联的用户成功，操作人：{}，物业公司ID：{}，返回数量：{}", currentUserId, propertyCompanyId, result.size());
            return Result.success("查询成功", result);
        } catch (Exception e) {
            log.error("获取物业公司关联的用户失败，操作人：{}，物业公司ID：{}，错误信息：{}", SecurityUtils.getCurrentUserId(), propertyCompanyId, e.getMessage(), e);
            return Result.fail("查询失败：" + e.getMessage());
        }
    }
} 